查看原文
其他

内存加载Dll

KamiBoy 看雪学院 2019-05-26

几年前写过一份内存加载PE文件的项目,支持exe和dll,但不支持mfc dll
去年整理了一下重新写了代码,省略了一些功能,只用来加载dll


编译环境:

  • vs2005

  • vc6.0


支持:

  • 标准Win32 Dll

  • MFC Dll

  • 易语言Dll

  • 其他Dll(这个没怎么测试)


不支持:

  • 加密Dll

  • 压缩Dll(具体看压缩流程)


File: include/ldr.h


/* __ldr_header__ */

#ifndef __LDR_H__
#define __LDR_H__

#ifdef _DEBUG
#pragma comment(lib, "image.d.lib")
#else
#pragma comment(lib, "image.lib")
#endif

#ifdef _WIN32
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include <Windows.h>
#include <WinNT.h>
#else
#error Current platform is not supported
#endif

typedef PVOID (__stdcall *malloc_t)    (ULONG);
typedef VOID  (__stdcall *free_t)    (PVOID);

PVOID    LdrLoadImage        (PVOID Buffer, DWORD Size, malloc_t m = NULL, free_t f = NULL);
PVOID    LdrGetProcAddress    (PVOID Addr, LPCSTR Name);
VOID    LdrFreeImage        (PVOID Addr);

#endif


Dll处理接口


PVOID    LdrLoadImage        (PVOID Buffer, DWORD Size, malloc_t m = NULL, free_t f = NULL);
PVOID    LdrGetProcAddress    (PVOID Addr, LPCSTR Name);
VOID    LdrFreeImage        (PVOID Addr);


之前发过一个帖子,用的易语言封装了编译的lib测试的内存加载Dll


 

项目源码(阅读原文查看)

 

顺便说一下,对MFC Dll的支持主要是处理了GetModuleHandle相关的API,做了一层中间层。


File:image/traps/GetModuleHandleW.asm


.386
.Model flat, StdCall
Option CaseMap: none

Include    trap.inc

.Const

.Data?

.Data

.Code

GetModuleHandleWTrap Proc Uses Ebx Ecx Edx Esi Edi, lpModuleName: Ptr WCHAR
   ; Mov Esi, 0x********
   Mov_Esi_Information
   ; Pointer to ImageInformation
   Assume Esi: Ptr ImageInformation

   .If lpModuleName == 0
       Push 0
       Call [Esi].traps[SizeOf ImageTrap * TRAP_ID_GET_MODULE_HANDLE_W].procedure
   .Else
       Lea Ebx, [Esi].ModuleNameW
       Push Ebx
       Push lpModuleName
       Call [Esi].apis.lstrcmpiW

       Cmp Eax, 0
       Je __COPY

       Lea Ebx, [Esi].ModuleBaseNameW
       Push Ebx
       Push lpModuleName
       Call [Esi].apis.lstrcmpiW  

       Cmp Eax, 0
       Jne __CALL

   __COPY:
       Mov Eax, [Esi].imagebase
       Jmp @F

   __CALL:  
       Push lpModuleName
       Call [Esi].traps[SizeOf ImageTrap * TRAP_ID_GET_MODULE_HANDLE_W].procedure
   @@:
   .EndIf

   Return Eax
GetModuleHandleWTrap EndP

End

肯定有人觉得为什么不支持x64,主要还是自己平时没那么时间弄,要上班,之前一直想迭代一下支持压缩加密啥的,也一直搁着,哎~



看雪ID:KamiBoy    

bbs.pediy.com/user-589827



本文由看雪论坛 KamiBoy  原创

转载请注明来自看雪社区







戳原文,看看大家都是怎么说的?

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存